package com.saver.core.persistence;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

import com.saver.view.TransaccionView;

public class TransaccionViewSQLite extends DatabaseHelper {
	
	private static final String TAG = "TransaccionViewSQLite";

	private static final int VERSION = 1;
	private static final String NAME = "saverDB" ;
	private static final CursorFactory FACTORY = null;
	private static final String QUERY_TRANSACCIONES = " SELECT ID_TRANSACCION,T.ID_CATEGORIA, T.ID_BANCO, " +
													  " T.ID_ESTABLECIMIENTO, MONTO, FECHA_TRANSACCION, T.NUMERO, FECHA_TEXT," +
													  " C.NOMBRE NOMBRE_CATEGORIA, B.NOMBRE NOMBRE_BANCO, ES.NOMBRE NOMBRE_ESTABLECIMIENTO, C.ICONO," +
													  " CAE.NOMBRE, COLOR , T.REFERENCIA" +
													  " FROM TRANSACCIONES T" +
													  " INNER JOIN CATEGORIAS C ON T.ID_CATEGORIA= C.ID_CATEGORIA " +
													  " INNER JOIN BANCOS B ON B.ID_BANCO = T.ID_BANCO " +
													  " LEFT JOIN ESTABLECIMIENTOS_EQUIV ES ON ES.ID_ESTABLECIMIENTO_EQUIV = T.ID_ESTABLECIMIENTOS_EQUIV" +
													  " LEFT JOIN CATEGORIAS_EQUIV CAE ON CAE.ID_CATEGORIA_EQUIV = T.ID_CATEGORIAS_EQUIV";
	
	public TransaccionViewSQLite(Context context) {
		super(context, NAME, FACTORY, VERSION);
	}
	
	public List<TransaccionView> listarTransaccionesXCategoria( Integer idCategoria, Integer anio){
		SQLiteDatabase db = getReadableDatabase();
        StringBuilder builder = new StringBuilder(QUERY_TRANSACCIONES);
        builder.append(" where strftime('%Y',fecha_text)='").append(anio).append("'");
        if (idCategoria != null) {
            builder.append(" and C.ID_CATEGORIA =").append(idCategoria);
        }
        builder.append(" ORDER BY FECHA_TRANSACCION DESC;");
		Cursor cursor = db.rawQuery(builder.toString(), null);
		List<TransaccionView> transacciones = recorrerTransacciones( cursor );
		db.close();
		return transacciones;
	}
	
	public List<TransaccionView> listarTransaccionesXRevisar(){
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.rawQuery(QUERY_TRANSACCIONES +
									" where REVISADO = 2 " +
									" ORDER BY FECHA_TRANSACCION DESC;", null);
		List<TransaccionView> transacciones = new ArrayList<TransaccionView>();

		transacciones = recorrerTransacciones( cursor );
		db.close();
		return transacciones;
	}
	public List<TransaccionView> listarTransaccionesXCategoria(Integer idCategoria, Integer anio, Integer mes){
		DecimalFormat df = new DecimalFormat("00");
		SQLiteDatabase db = getReadableDatabase();
        StringBuilder builder = new StringBuilder(QUERY_TRANSACCIONES);
        builder.append(" where strftime('%Y',fecha_text)='").append(anio).append("'");
        builder.append(" and strftime('%m',fecha_text) ='").append(df.format(mes)).append("'");
        if (idCategoria != null) {
            builder.append(" and C.ID_CATEGORIA =").append(idCategoria);
        }
        builder.append(" ORDER BY FECHA_TRANSACCION DESC;");
		Cursor cursor = db.rawQuery(builder.toString(), null);
		List<TransaccionView> transacciones = recorrerTransacciones( cursor );
		db.close();
		return transacciones;
	}

	public List<TransaccionView> listarTransaccionesXCategoria( Integer idCategoria, Integer anio, Integer mes, Integer dia){
		DecimalFormat df = new DecimalFormat("00");
		SQLiteDatabase db = getReadableDatabase();
        StringBuilder builder = new StringBuilder(QUERY_TRANSACCIONES);
        builder.append(" where strftime('%Y',fecha_text)='").append(anio).append("'");
        builder.append(" and strftime('%m',fecha_text) ='").append(df.format(mes)).append("'");
        builder.append(" and strftime('%d',fecha_text) ='").append(df.format(dia)).append("'");
        if (idCategoria != null) {
            builder.append(" and C.ID_CATEGORIA =").append(idCategoria);
        }
        builder.append(" ORDER BY FECHA_TRANSACCION DESC;");
		Cursor cursor = db.rawQuery(builder.toString(), null);
		List<TransaccionView> transacciones = recorrerTransacciones( cursor );
		db.close();
		return transacciones;
	}
	
	public List<TransaccionView> recorrerTransacciones( Cursor cursor ){
		ArrayList<TransaccionView> transacciones = new ArrayList<TransaccionView>();
		while (cursor.moveToNext()) {
			TransaccionView transaccion = crearTransaccion (cursor);
			transacciones.add(transaccion);
		}
		return transacciones;
	}

	private TransaccionView crearTransaccion(Cursor cursor) {
		TransaccionView transaccion = new TransaccionView();
		transaccion.setId(cursor.getInt(0));
		transaccion.setIdCategoria(cursor.getInt(1));
		transaccion.setIdBanco(cursor.getInt(2));
		transaccion.setIdEstablecimiento(cursor.getInt(3));
		transaccion.setMonto(cursor.getDouble(4));
		transaccion.setFechaTransaccion(cursor.getLong(5));
		transaccion.setNumero(cursor.getString(6));
		transaccion.setFechaText(cursor.getString(7));
		transaccion.setNombreCategoria(cursor.getString(8));
		transaccion.setNombreBanco(cursor.getString(9));
		transaccion.setNombreEstablecimiento(cursor.getString(10));
		transaccion.setIcono(cursor.getString(11));
		transaccion.setNombreCategoriaEquiv(cursor.getString(12));
        transaccion.setColor(cursor.getString(13));
        transaccion.setReferencia(cursor.getString(14));
		return transaccion;
	}

}

